//
//  ViewController.m
//  NSOperation
//
//  Created by admin on 2019/8/18.
//  Copyright © 2019 猫爷爷的酱醋茶. All rights reserved.
//

/*
 
 NSOperation
    - 是一个抽象类（父类），不能直接使用（方法没有实现），用来束缚子类
 
 NSOperation的子类
    - NSInvocationOperation
    - NSBlockOperation
        - 只要封装数超过1，就会异步执行操作
        - 通过addExecutionBlock:方法添加更多操作
    - 自定义operation
 
    将需要执行的操作封装到一个NSOperation对象中，然后将对象添加到NSOperationQueue中
    系统会自动将NSOperationQueue中的NSOperation取出来，将其操作放在一个新线程中执行
 
 
 */
#import "ViewController.h"

@interface ViewController ()

//如果需要多次调用队列，可以定义为全局队列
@property(nonatomic,strong)NSOperationQueue *queue;


@end

@implementation ViewController

//懒加载
- (NSOperationQueue *)queue
{
    if (_queue == nil)
    {
        _queue = [[NSOperationQueue alloc]init];
    }
    return _queue;
}


- (void)viewDidLoad {
    [super viewDidLoad];
   
    
    [self globalQueue];
}

//线程间的通信
-(void)downloadImage
{
    [self.queue addOperationWithBlock:^{
        NSLog(@"下载图片...");
        
        //回到主线程
        [[NSOperationQueue mainQueue]addOperationWithBlock:^{
            NSLog(@"更新UI");
        }];
    }];
}

//全局队列
-(void)globalQueue
{
    //并发队列，异步执行
    for (int i = 0; i < 10; i++)
    {
        [self.queue addOperationWithBlock:^{
            NSLog(@"向更高的待遇出发~ - %d %@",i,[NSThread currentThread]);
        }];
    }
    
}

-(void)blockOperation
{
    //创建队列
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    
    //在队列中直接操作
    [queue addOperationWithBlock:^{
        NSLog(@"先更高的待遇出发~ %@",[NSThread currentThread]);
    }];
    
}

-(void)blockOperationTwo
{
    //创建操作
    NSBlockOperation * op = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"先更高的待遇出发~ %@",[NSThread currentThread]);
    }];
    
    //创建队列
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    
    //添加入队列
    [queue addOperation:op];
}

-(void)blockOperationOne
{
    //创建
    NSBlockOperation * op = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"先更高的待遇出发~ %@",[NSThread currentThread]);
    }];
    
    //更新状态，调用main方法执行，不创建新的线程
    [op start];
    
}

-(void)operationQueue
{
    //创建操作
    NSInvocationOperation *op = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(demo) object:nil];
    
    //创建队列
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    
    //将操作添加到队列中
    //会开启新的线程
    [queue addOperation:op];
}

 //创建操作
-(void)invocationOperation
{
    //创建操作
    NSInvocationOperation *op = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(demo) object:nil];
    
    //查询操作的状态
    NSLog(@"%d",op.isFinished);
    
    //start方法更新操作状态
    //不开启新线程，在main中执行
    [op start];
    [op start];
    [op start];
    
    //查询操作的状态
    NSLog(@"%d",op.isFinished);
    
}

-(void)demo
{
    NSLog(@"猫爷爷的酱醋茶，继续学习~ %@",[NSThread currentThread]);
}

@end
